package shiyanshi.qiandao.demo.util;
/**
 * JDBC原生编程
 *
 * JDBC 指 Java 数据库连接，是一种标准Java应用编程接口（ JAVA API），
 * 用来连接 Java 编程语言和广泛的数据库。
 *
 * JDBC API 库包含下面提到的每个任务，都是与数据库相关的常用用法。
 *
 * 制作到数据库的连接。
 * 创建 SQL 语句。
 * 执行 SQL 查询数据库。
 * 查看和修改所产生的记录。
 *
 *
 * 如下所示为JDBC开发中主要用到的类。
 *
 * DriverManager ：这个类管理一系列数据库驱动程序。匹配连接使用通信子协议从 JAVA 应用程序中请求合适的数据库驱动程序。识别 JDBC 下某个子协议的第一驱动程序将被用于建立数据库连接。
 * Driver : 这个接口处理与数据库服务器的通信。你将很少直接与驱动程序互动。相反，你使用 DriverManager 中的对象，它管理此类型的对象。它也抽象与驱动程序对象工作相关的详细信息。
 * Connection : 此接口具有接触数据库的所有方法。该连接对象表示通信上下文，即，所有与数据库的通信仅通过这个连接对象进行。
 * Statement : 使用创建于这个接口的对象将 SQL 语句提交到数据库。除了执行存储过程以外，一些派生的接口也接受参数。
 * ResultSet : 在你使用语句对象执行 SQL 查询后，这些对象保存从数据获得的数据。它作为一个迭代器，让您可以通过它的数据来移动。
 * SQLException : 这个类处理发生在数据库应用程序的任何错误。
 *
 * JDBC 提供了连接方法通过下列创建语句来生成你所需的 ResultSet 对象：
 * createStatement(int RSType, int RSConcurrency);
 * prepareStatement(String SQL, int RSType, int RSConcurrency);
 * prepareCall(String sql, int RSType, int RSConcurrency);
 *
 */

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

/**
 * JDBC的工具类
 *
 */
public class JDBCUtils {
	private static final String driverClass;
	private static final String url;
	private static final String username;
	private static final String password;
	private static boolean flag=false; //驱动是否已经加载
	
	static{
		// 如何获得属性文件的输入流？
		// 通常情况下使用类的加载器的方式进行获取：
		//项目更目录获取配置文件
 		InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
		//当前文件所在目录获取配置文件
//		InputStream is = JDBCUtils.class.getResourceAsStream("jdbc.properties");
//		InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
		// 加载属性文件并解析：
		Properties props = new Properties();
		try {
			props.load(is);
		} catch (IOException e) {
			e.printStackTrace();
		}
		driverClass = props.getProperty("driverClass");
		url = props.getProperty("url");
		username = props.getProperty("username");
		password = props.getProperty("password");
	}

	/**
	 * 注册驱动的方法
	 * @throws ClassNotFoundException 
	 */
	public static void loadDriver() throws ClassNotFoundException{
		if(!flag) {
			Class.forName(driverClass);
			flag = true;
		}

	}
	
	/**
	 * 获得连接的方法:
	 * @throws SQLException 
	 */
	public static Connection getConnection() throws Exception{
		loadDriver();
		Connection conn = DriverManager.getConnection(url, username, password);
		return conn;
	}
	
	/**
	 * 资源释放
	 */
	public static void release(Statement stmt,Connection conn){
		if(stmt != null){
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			stmt = null;
		}
		if(conn != null){
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			conn = null;
		}
	}
	
	public static void release(ResultSet rs,Statement stmt,Connection conn){
		if(rs!= null){
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			rs = null;
		}
		if(stmt != null){
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			stmt = null;
		}
		if(conn != null){
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			conn = null;
		}
	}
}
